﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ChatApp.Service.Model;
using System.ComponentModel;
using System.Transactions;

namespace ChatApp.Service.Business
{
    public class MessageBLL
    {
        /// <summary>
        /// Chat gửi message qua lại
        /// </summary>
        /// <param name="idRoom"></param>
        /// <param name="tenRoom"></param>
        /// <param name="laChatRoom"></param>
        /// <param name="userNameSend"></param>
        /// <param name="text"></param>
        /// <param name="listUserNameReceive"></param>
        /// <returns>Trả về IdRoom</returns>
        public int SendMessage(int idRoom, string tenRoom, bool laChatRoom, string userNameSend, string text, List<string> listUserNameReceive)
        {
            using (TransactionScope trans = new TransactionScope())
            {
                try
                {
                    using (DBChatEntities entities = new DBChatEntities())
                    {
                        // Trường hợp room chưa được tạo. Chưa chat
                        if (idRoom == 0)
                        {
                            Room room = new Room();
                            room.LaChatRoom = laChatRoom;
                            room.NgayTao = DateTime.Now;
                            entities.Rooms.AddObject(room);
                            entities.SaveChanges();
                            idRoom = room.IdRoom;
                        }

                        object[] parameters = new object[] { idRoom, tenRoom, userNameSend, text, laChatRoom, listUserNameReceive };

                        // Thuc hien ngam refreshData()
                        BackgroundWorker backgroundWorker = new BackgroundWorker();
                        backgroundWorker.DoWork += BackgroundWorker_DoWork;
                        backgroundWorker.RunWorkerAsync(parameters);

                        // Khi hoàn thành tất cả thì hoàn thành Transaction
                        trans.Complete();
                    }

                    return idRoom;
                }
                catch (Exception)
                {
                    // Nếu không hoàn thành thì RollBack
                    // Trả về IdRoom = 0;
                    return 0;
                }
            }

        }

        private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            // Lấy giá trị tham số
            object[] parameters = e.Argument as object[];
            int idRoom = (int)parameters[0];
            string tenRoom = parameters[1] as string;
            string userNameSend = parameters[2] as string;
            string text = parameters[3] as string;
            bool laChatRoom = (bool)parameters[4];
            List<string> listUserNameReceive = parameters[5] as List<string>;

            // Xác định idMessage sau khi lưu vào database
            int idMessage = 0;

            // Lưu đoạn chát vào bảng Message
            using (DBChatEntities entities = new DBChatEntities())
            {
                Message message = new Message();
                message.UserName = userNameSend;
                message.IdRoom = idRoom;
                message.Content = text;
                message.NgayTao = DateTime.Now;
                entities.Messages.AddObject(message);
                entities.SaveChanges();
                idMessage = message.IdMessage;
            }

            // Trường hợp lưu message thành công
            if (idMessage > 0)
            {
                // Lặp tất cả những người chát trong room
                foreach (string userNameReceive in listUserNameReceive)
                {
                    // Lặp danh sách địa chỉ của tất cả người dùng đã login vào ứng dụng
                    foreach (var item in ChatAppServiceGlobal.listClientCallBack)
                    {
                        if (userNameReceive == item.Key)
                        {
                            try
                            {
                                item.Value.RefreshContentChat(idRoom, tenRoom, userNameSend, text, laChatRoom);

                                // Lưu thông tin vào message user receive khi refresh danh sách chát thành công 
                                using (DBChatEntities entities = new DBChatEntities())
                                {
                                    MessageUserReceive mur = new MessageUserReceive();
                                    mur.IdMessage = idMessage;
                                    mur.UserNameReceive = userNameReceive;
                                    mur.IsRead = true;
                                    entities.MessageUserReceives.AddObject(mur);
                                    entities.SaveChanges();
                                }
                            }
                            catch (Exception)
                            {
                                // Lưu thông tin vào message user receive khi refresh danh sách chát không thành công ==> chuyển sang chế độ tin nhắn
                                using (DBChatEntities entities = new DBChatEntities())
                                {
                                    MessageUserReceive mur = new MessageUserReceive();
                                    mur.IdMessage = idMessage;
                                    mur.UserNameReceive = userNameReceive;
                                    mur.IsRead = false;
                                    entities.MessageUserReceives.AddObject(mur);
                                    entities.SaveChanges();
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}